How many sentences do you use to describe a happy moment?
Most happy moments is only in one sentence. Simple but powerful, isn’t it?
However, A few happy memory is a long story and we need more words to express our feelings. Young people, especially male around age of 25, like to write extra long paragraphs describing their happy moments.
There are some outliers in the data set. Someone copied a story and had multiple same entries. I have removed these answers from the data set.

Happiness in ONE line!
In order to avoid randomness, I focus on those moments written in one line.
What are they about?
Achievements and affection are two major sources of our happiness. A possible guess is that achievements are from our jobs and work, and feelings of affection are from our friends and family.

A lot of happy time happen between friends, family, wife, husband, daughter, son and ourselves.
Now, I want oanalyze frequencies of words at different positions in a sentence.
Obviously, most happy moments focus on ourselves and things happen on us.
Naturally, we can always find happiness with our family and friends. I also notice an interesting fact is that son/daughter appears more often than mother/father/mom/dad. Animals, including human, care about their children much more than their parents. This rule is reflected here.
- What things makes us happy?
Some happiness are from work like a job promotion, a salary raise. Some happiness are just small things like a tasty dinner,a good movie, or a book. Some happiness are from our pets. Dog is the most beloved pet for Americans.



Sentiment Analysis
I calculated the average sentiment score by their gender, marital and parenthood status. Surprisingly, single dads have the highest postivity score. Another interesting fact is that for female, married women have similar or slight higher positivity score with unmarried women. However, the scenerio is opposite for male. Perhaps it is because women enjoy marriage more than men.
Having a child also infuences the positivity score of male and female in different ways. A married women who has kids has a lower score than a married women who does’t have kids. Men who have kids have a positivity score higher than those who don’t have kids.

I also calculate the average sentiment score of different categories. Though not so much entries of happy moments are about nature, nature has the highest positivity score among all categories. Because there are more nice words when describing the nature, such as beautiful, warm and so on. We will see that in a moment.

- What words have the most effect on sentiment scores overall?

- What word have the most effect on sentiment scores within each category

Bigram Analysis
- What is your favorite thing?

Here I count top ten words preceded by word favorite/favourite. Interestingly, SEVEN of them, including the top ones, are about eating. Those words are restaurant, food, meal, dish, snack, sweet, dinner. Apparently, Eating is so happy!
Dinner, my favorite eating time!
Of all three meals, we love dinners, expecially with our beloved friends and family. If you are struggling or frustrated about something, having a decent dinner may be the quikest way to get you happy.
Yummy! I am so happy when I am eating/drinking …
Here’s most frequent words about food and drinks in the set. Coffee and Pizza are the best food/drink to cheer one up. Sweet dessert like ice cream, chocolate, cake and candy can also give a sense of sweetness to our lives.
Next time, if you are unhappy, maybe you are just hungry. Order a pizza and invite your friend to share it with you, everything will be okay :)
I also noted that among these food, the only one that is more authentic is Sushi. Maybe that’s reason why sushi is so polular worldwide.
Future Analysis
Some future anaysis I can think of right now is
topic modeling, categorized happy moments into topics like exercise, shopping, job, eating, pets, video games…
Differences between happy memories reflected from short term and long term.
Based on different segmentatio of people, analyze what activities they like to do.
LS0tCnRpdGxlOiAiSGFwcHkgTW9tZW50cyIKYXV0aG9yOiBMdWppYSBXYW5nIChsdzI3NzIpCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9CnBhY2thZ2VzLnVzZWQ9YygidG0iLCAidGlkeXZlcnNlIiwgInRpZHl0ZXh0IiwgCiAgICAgICAgICAgICAgICAiRFQiLCAic2NhbGVzIiwgIndvcmRjbG91ZDIiLAogICAgICAgICAgICAgICAgImdyaWRFeHRyYSIsICJuZ3JhbSIpCgojIGNoZWNrIHBhY2thZ2VzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQuCnBhY2thZ2VzLm5lZWRlZD1zZXRkaWZmKHBhY2thZ2VzLnVzZWQsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnVzZWQpKQojIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcwppZihsZW5ndGgocGFja2FnZXMubmVlZGVkKT4wKXsKICBpbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2VzLm5lZWRlZCwgZGVwZW5kZW5jaWVzID0gVFJVRSkKfQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShEVCkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkod29yZGNsb3VkMikKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkobmdyYW0pCmBgYAoKCgpgYGB7ciBsb2FkIGRhdGEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KIyBMb2FkIGRlbW9ncmFwaGljIGRhdGEsIHByb2Nlc3NlZCB0ZXh0IGRhdGEgYW5kIHNlbnNlbGFiZWwgZGF0YQpobV9kYXRhIDwtIHJlYWRfY3N2KCIuLi9vdXRwdXQvcHJvY2Vzc2VkX21vbWVudHMuY3N2IikKZGVtby51cmxmaWxlPC0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JpdC1wdWJsaWMvSGFwcHlEQi9tYXN0ZXIvaGFwcHlkYi9kYXRhL2RlbW9ncmFwaGljLmNzdicKc2Vuc2UudXJsZmlsZSA8LSAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JpdC1wdWJsaWMvSGFwcHlEQi9tYXN0ZXIvaGFwcHlkYi9kYXRhL3NlbnNlbGFiZWwuY3N2JwpzZW5zZV9kYXRhIDwtIHJlYWRfY3N2KHNlbnNlLnVybGZpbGUscHJvZ3Jlc3MgPSBGQUxTRSkKZGVtb19kYXRhIDwtIHJlYWRfY3N2KGRlbW8udXJsZmlsZSkKZGVtb19kYXRhJGFnZSA8LSBhcy5udW1lcmljKGRlbW9fZGF0YSRhZ2UpICMgY2hhbmdlIGFnZSBkYXRhdHlwZSBpbnRvIG51bWVyaWMKYGBgCgoKYGBge3IgY29tYmluaW5nIGRhdGEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KIyBDb21iaW5lIGJvdGggdGhlIGRhdGEgc2V0cyBhbmQga2VlcCB0aGUgcmVxdWlyZWQgY29sdW1ucyBmb3IgYW5hbHlzaXMKIyBXZSBzZWxlY3QgYSBzdWJzZXQgb2YgdGhlIGRhdGEgdGhhdCBzYXRpc2ZpZXMgc3BlY2lmaWMgcm93IGNvbmRpdGlvbnMuCmhtX2RhdGEgPC0gaG1fZGF0YSAlPiUKICBpbm5lcl9qb2luKGRlbW9fZGF0YSwgYnkgPSAid2lkIikgJT4lCiAgc2VsZWN0KGlkLAogICAgICAgICBobWlkLAogICAgICAgICB3aWQsCiAgICAgICAgIGNsZWFuZWRfaG0sCiAgICAgICAgIGdlbmRlciwgCiAgICAgICAgIG1hcml0YWwsIAogICAgICAgICBwYXJlbnRob29kLAogICAgICAgICByZWZsZWN0aW9uX3BlcmlvZCwKICAgICAgICAgbnVtX3NlbnRlbmNlLAogICAgICAgICBhZ2UsIAogICAgICAgICBjb3VudHJ5LCAKICAgICAgICAgZ3JvdW5kX3RydXRoX2NhdGVnb3J5LAogICAgICAgICBwcmVkaWN0ZWRfY2F0ZWdvcnksCiAgICAgICAgIHRleHQpICU+JQogIG11dGF0ZShjb3VudCA9IHNhcHBseShobV9kYXRhJHRleHQsIHdvcmRjb3VudCkpICU+JQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCJtIiwgImYiKSkgJT4lCiAgZmlsdGVyKG1hcml0YWwgJWluJSBjKCJzaW5nbGUiLCAibWFycmllZCIpKSAlPiUKICBmaWx0ZXIoYWdlIDwgMTIwICYgYWdlPjUpICU+JSAgI3NvbWUgYWdlcyBhcmUgdW5yZWFzb25hYmxlCiAgZmlsdGVyKHBhcmVudGhvb2QgJWluJSBjKCJuIiwgInkiKSkgJT4lCiAgZmlsdGVyKHJlZmxlY3Rpb25fcGVyaW9kICVpbiUgYygiMjRoIiwgIjNtIikpICU+JQogICNmaWx0ZXIoY291bnRyeT09IlVTQSIpICU+JSAgICAgICAgICAgICAgI3NvbWUgbGFuZ3VhZ2VzIGZyb20gb3RoZXIgY291bnRyaWVzIGFyZSB3ZWlyZAogIG11dGF0ZShyZWZsZWN0aW9uX3BlcmlvZCA9IGZjdF9yZWNvZGUocmVmbGVjdGlvbl9wZXJpb2QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzXzMgPSAiM20iLCBob3Vyc18yNCA9ICIyNGgiKSkKCmBgYAoKIyMjIEhvdyBtYW55IHNlbnRlbmNlcyBkbyB5b3UgdXNlIHRvIGRlc2NyaWJlIGEgaGFwcHkgbW9tZW50PwoKTW9zdCBoYXBweSBtb21lbnRzIGlzIG9ubHkgaW4gb25lIHNlbnRlbmNlLiBTaW1wbGUgYnV0IHBvd2VyZnVsLCBpc24ndCBpdD8KCkhvd2V2ZXIsIEEgZmV3IGhhcHB5IG1lbW9yeSBpcyBhIGxvbmcgc3RvcnkgYW5kIHdlIG5lZWQgbW9yZSB3b3JkcyB0byBleHByZXNzIG91ciBmZWVsaW5ncy4gWW91bmcgcGVvcGxlLCBlc3BlY2lhbGx5IG1hbGUgYXJvdW5kIGFnZSBvZiAyNSwgbGlrZSB0byB3cml0ZSBleHRyYSBsb25nIHBhcmFncmFwaHMgZGVzY3JpYmluZyB0aGVpciBoYXBweSBtb21lbnRzLgoKKlRoZXJlIGFyZSBzb21lIG91dGxpZXJzIGluIHRoZSBkYXRhIHNldC4gU29tZW9uZSBjb3BpZWQgYSBzdG9yeSBhbmQgaGFkIG11bHRpcGxlIHNhbWUgZW50cmllcy4gSSBoYXZlIHJlbW92ZWQgdGhlc2UgYW5zd2VycyBmcm9tIHRoZSBkYXRhIHNldC4qCgpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9CiMgcmVtb3ZlIHVucmVsYXRlZCBhbnN3ZXJzCmhtX2RhdGEgPC0gaG1fZGF0YSU+JWZpbHRlcih3aWQhPTQ1NSZ3aWQhPTUwOCkKIyBjYWxjdWxhdGVkIG51bWJlciBvZiBzZW50ZW5jZXMgZGlzdHJpYnV0aW9uIGJ5IGdlbmRlcgpudW1fc2VudGVuY2VfZGlzdCA8LSBobV9kYXRhICU+JSBncm91cF9ieShudW1fc2VudGVuY2UsZ2VuZGVyKSAlPiUgc3VtbWFyaXNlKG49bGVuZ3RoKGlkKSkKbnVtX3NlbnRlbmNlX2Rpc3QkbnVtX3NlbnRlbmNlW251bV9zZW50ZW5jZV9kaXN0JG51bV9zZW50ZW5jZSA+IDVdIDwtICc+NScKbnVtX3NlbnRlbmNlX2Rpc3QkbnVtX3NlbnRlbmNlIDwtIGZhY3RvcihudW1fc2VudGVuY2VfZGlzdCRudW1fc2VudGVuY2UsbGV2ZWxzID0gYygiPjUiLCAiNSIsICI0IiwiMyIsIjIiLCIxIikpCgojIEFnZSBhbmQgbnVtYmVyIG9mIHNlbnRlbmNlIHNjYXR0ZXIgcGxvdApwMSA8LSBnZ3Bsb3QoaG1fZGF0YSwgYWVzKHg9YWdlLCB5PW51bV9zZW50ZW5jZSxjb2xvcj1nZW5kZXIpKSArCiAgZ2VvbV9wb2ludChzaXplPTEsYWxwaGE9MC43KSArCiAgbGFicyh5PSdudW1iZXIgb2Ygc2VudGVuY2VzJyx0aXRsZT0iTnVtYmVyIG9mIHNlbnRlbmNlcyB2cyBBZ2VcbiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLCBmYWNlPSJib2xkIikpCiMgbnVtYmVyIG9mIHNlbnRlbmNlIGRpc3RyaWJ1dGlvbiBieSBnZW5kZXIgc3RhY2tlZCBiYXIgcGxvdApwMiA8LSBnZ3Bsb3QobnVtX3NlbnRlbmNlX2Rpc3QsIGFlcyh4PWdlbmRlciwgeT1uLCBmaWxsPW51bV9zZW50ZW5jZSkpKwogIGdlb21fYmFyKHdpZHRoID0gMC43LCBzdGF0ID0gImlkZW50aXR5IikrCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iR25CdSIpICsKICBsYWJzKGZpbGw9J251bWJlciBvZiBcbnNlbnRlbmNlcycsCiAgICAgICB0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIG51bWJlciBcbm9mIHNlbnRlbmNlcyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFjZT0iYm9sZCIpKQoKZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbnJvdyA9IDIsIG5jb2wgPSAzLCBsYXlvdXRfbWF0cml4PXJiaW5kKGMoMSwxLDIpLGMoMSwxLDIpKSkKYGBgCgoqKioKCiMgSGFwcGluZXNzIGluIE9ORSBsaW5lIQoKSW4gb3JkZXIgdG8gYXZvaWQgcmFuZG9tbmVzcywgSSBmb2N1cyBvbiB0aG9zZSBtb21lbnRzIHdyaXR0ZW4gaW4gb25lIGxpbmUuCgojIyMgV2hhdCBhcmUgdGhleSBhYm91dD8KCkFjaGlldmVtZW50cyBhbmQgYWZmZWN0aW9uIGFyZSB0d28gbWFqb3Igc291cmNlcyBvZiBvdXIgaGFwcGluZXNzLiBBIHBvc3NpYmxlIGd1ZXNzIGlzIHRoYXQgYWNoaWV2ZW1lbnRzIGFyZSBmcm9tIG91ciBqb2JzIGFuZCB3b3JrLCBhbmQgZmVlbGluZ3Mgb2YgYWZmZWN0aW9uIGFyZSBmcm9tIG91ciBmcmllbmRzIGFuZCBmYW1pbHkuCgpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9CiNmaWx0ZXIgaGFwcHkgbW9tZW50cyBpbiBvbmx5IG9uZSBzZW50ZW5jZS4Kb25lLmxpbmUgPC0gaG1fZGF0YSAlPiUgZmlsdGVyKG51bV9zZW50ZW5jZT09MSkKIyBwbG90IGEgY2lyY2xlIGJhciBwbG90IHRvIHNob3cgZGlzdHJpYnV0aW9ucyBvZiBoYXBweSBtb21lbnRzIGJ5IGNhdGVnb3J5LiAKZ2dwbG90KG9uZS5saW5lLCBhZXMoeD1wcmVkaWN0ZWRfY2F0ZWdvcnksZmlsbD1wcmVkaWN0ZWRfY2F0ZWdvcnkpKSArIAogIGdlb21fYmFyKCkgKwogIHlsaW0oLTIwMDAwLDI4MDAwKSArCiAgY29vcmRfcG9sYXIoc3RhcnQgPSAwKSsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2U9ImJvbGQiKSkgKwogIGxhYnModGl0bGU9J09uZS1saW5lIGhhcHB5IG1vbWVudHMgYnkgY2F0ZWdvcnknLGZpbGw9ImNhdGVnb3J5IikKYGBgCgpBIGxvdCBvZiBoYXBweSB0aW1lIGhhcHBlbiBiZXR3ZWVuIGZyaWVuZHMsIGZhbWlseSwgd2lmZSwgaHVzYmFuZCwgZGF1Z2h0ZXIsIHNvbiBhbmQgb3Vyc2VsdmVzLgoKYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9CmJhZ09mV29yZHMgPC0gIG9uZS5saW5lICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpCndvcmRfY291bnQgPC0gYmFnT2ZXb3JkcyU+JSBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkKd29yZF9jb3VudCAlPiUgdG9wX24oMjAsIG4pICU+JQpnZ3Bsb3QoYWVzKHg9cmVvcmRlcih3b3JkLG4pLHk9bikpKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLGZpbGw9InNreWJsdWUiKSsKICB0aGVtZV9taW5pbWFsKCkgKyBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGU9Ik1vc3QgZnJlcXVlbnQgd29yZHMgaW4gSGFwcHlEQiIsCiAgICAgICB5PSJmcmVxdWVuY3kiLHg9IndvcmRzIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZT0iYm9sZCIpKQojd29yZGNsb3VkMih3b3JkX2NvdW50LGVsbGlwdGljaXR5ID0gMC4xLHNpemU9MC42LGNvbG9yID0gInJhbmRvbS1saWdodCIpCmBgYAoKTm93LCBJIHdhbnQgb2FuYWx5emUgZnJlcXVlbmNpZXMgb2Ygd29yZHMgYXQgZGlmZmVyZW50IHBvc2l0aW9ucyBpbiBhIHNlbnRlbmNlLgoKICArIEhhcHBpbmVzcyBiZWdpbnMgd2l0aC4uLj8KCk9idmlvdXNseSwgbW9zdCBoYXBweSBtb21lbnRzIGZvY3VzIG9uIG91cnNlbHZlcyBhbmQgdGhpbmdzIGhhcHBlbiBvbiB1cy4KCiAgKyBXaG8gbWFrZXMgdXMgaGFwcHk/CgpOYXR1cmFsbHksIHdlIGNhbiBhbHdheXMgZmluZCBoYXBwaW5lc3Mgd2l0aCBvdXIgZmFtaWx5IGFuZCBmcmllbmRzLiBJIGFsc28gbm90aWNlIGFuIGludGVyZXN0aW5nIGZhY3QgaXMgdGhhdCBzb24vZGF1Z2h0ZXIgYXBwZWFycyBtb3JlIG9mdGVuIHRoYW4gbW90aGVyL2ZhdGhlci9tb20vZGFkLiBBbmltYWxzLCBpbmNsdWRpbmcgaHVtYW4sIGNhcmUgYWJvdXQgdGhlaXIgY2hpbGRyZW4gbXVjaCBtb3JlIHRoYW4gdGhlaXIgcGFyZW50cy4gVGhpcyBydWxlIGlzIHJlZmxlY3RlZCBoZXJlLgoKICArIFdoYXQgdGhpbmdzIG1ha2VzIHVzIGhhcHB5PwoKU29tZSBoYXBwaW5lc3MgYXJlIGZyb20gd29yayBsaWtlIGEgam9iIHByb21vdGlvbiwgYSBzYWxhcnkgcmFpc2UuIFNvbWUgaGFwcGluZXNzIGFyZSBqdXN0IHNtYWxsIHRoaW5ncyBsaWtlIGEgdGFzdHkgZGlubmVyLGEgZ29vZCBtb3ZpZSwgb3IgYSBib29rLiBTb21lIGhhcHBpbmVzcyBhcmUgZnJvbSBvdXIgcGV0cy4gRG9nIGlzIHRoZSBtb3N0IGJlbG92ZWQgcGV0IGZvciBBbWVyaWNhbnMuCgpgYGB7ciBIYXBwaW5lc3MgYmVnaW5zIHdpdGgsd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9CnNlbnNlIDwtIG9uZS5saW5lICU+JSBzZWxlY3QoImhtaWQiLCJwcmVkaWN0ZWRfY2F0ZWdvcnkiKSAlPiUgaW5uZXJfam9pbihzZW5zZV9kYXRhLCBieT0iaG1pZCIpCnNlbnNlJHN1cGVyc2Vuc2VMYWJlbFtzZW5zZSRsb3dlcmNhc2VMZW1tYT09ImZhbWlseSJdIDwtICJuLnBlcnNvbiIKc2Vuc2UkUE9TW3NlbnNlJGxvd2VyY2FzZUxlbW1hPT0iaSJdID0gIlBST04iCnNlbnNlJHN1cGVyc2Vuc2VMYWJlbFtzZW5zZSRsb3dlcmNhc2VMZW1tYT09InRpbWUiXSA8LSAibi50aW1lIgpzZW5zZSRzdXBlcnNlbnNlTGFiZWxbc2Vuc2UkbG93ZXJjYXNlTGVtbWE9PSJ5ZWFyIl0gPC0gIm4udGltZSIKCmZpcnN0X3dvcmRfY291bnQgPC0gc2Vuc2UgJT4lZmlsdGVyKHRva2VuT2Zmc2V0PT0xKSAlPiUgY291bnQobG93ZXJjYXNlTGVtbWEsIHNvcnQgPSBUUlVFKQpwMSA8LSBnZ3Bsb3QoZmlyc3Rfd29yZF9jb3VudFsxOjIwLF0sIGFlcyh4PXJlb3JkZXIobG93ZXJjYXNlTGVtbWEsbikseT1uKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsZmlsbD0iT3JhbmdlIikrCiAgdGhlbWVfbWluaW1hbCgpICsgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlPSJIYXBwaW5lc3MgYmVnaW5zIHdpdGguLi4/IiwKICAgICAgIHk9ImZyZXF1ZW5jeSIseD0iZmlyc3Qgd29yZHMgaW4gc2VudGVuY2VzIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFjZT0iYm9sZCIpKQogIApgYGAKCmBgYHtyIFdobyBtYWtlcyB1cyBoYXBweSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KcGVyc29uX3dvcmRfY291bnQgPC0gc2Vuc2UgJT4lCiAgZmlsdGVyKFBPUz09Ik5PVU4iJnN1cGVyc2Vuc2VMYWJlbD09Im4ucGVyc29uIiklPiUKICBjb3VudChsb3dlcmNhc2VMZW1tYSwgc29ydCA9IFRSVUUpCnAyIDwtIGdncGxvdChwZXJzb25fd29yZF9jb3VudFsxOjIwLF0sIAogICAgICAgYWVzKHg9cmVvcmRlcihsb3dlcmNhc2VMZW1tYSxuKSx5PW4pKSsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0iY2hvY29sYXRlIikrCiAgdGhlbWVfbWluaW1hbCgpICsgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlPSJXaG8gbWFrZXMgdXMgaGFwcHk/Iix5PSJmcmVxdWVuY3kiLHg9IndvcmRzIG9mIHBlb3BsZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhY2U9ImJvbGQiKSkKICAKYGBgCgpgYGB7ciBXaGF0IHRoaW5nIG1ha2VzIHVzIGhhcHB5LHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQpub3VuX3dvcmRfY291bnQgPC0gc2Vuc2UgJT4lCiAgZmlsdGVyKFBPUz09Ik5PVU4iJnN1cGVyc2Vuc2VMYWJlbCE9Im4ucGVyc29uIiZzdXBlcnNlbnNlTGFiZWwhPSJuLnRpbWUiKSU+JQogIGNvdW50KGxvd2VyY2FzZUxlbW1hLCBzb3J0ID0gVFJVRSkKcDMgPC0gZ2dwbG90KG5vdW5fd29yZF9jb3VudFsxOjIwLF0sIAogICAgICAgYWVzKHg9cmVvcmRlcihsb3dlcmNhc2VMZW1tYSxuKSx5PW4pKSsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IixmaWxsPSJza3libHVlIikrCiAgdGhlbWVfbWluaW1hbCgpICsgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlPSJXaGF0IHRoaW5ncyBtYWtlIHVzIGhhcHB5PyIsCiAgICAgICB5PSJmcmVxdWVuY3kiLHg9IndvcmQgb2YgdGhpbmdzIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsIGZhY2UgPSAiYm9sZCIpKQogIApncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgbmNvbD0zKQpgYGAKCioqKgoKIyMgU2VudGltZW50IEFuYWx5c2lzCgoqIEJ5IGRlb21vZ3JhcGhpYwoKSSBjYWxjdWxhdGVkIHRoZSBhdmVyYWdlIHNlbnRpbWVudCBzY29yZSBieSB0aGVpciBnZW5kZXIsIG1hcml0YWwgYW5kIHBhcmVudGhvb2Qgc3RhdHVzLiBTdXJwcmlzaW5nbHksIHNpbmdsZSBkYWRzIGhhdmUgdGhlIGhpZ2hlc3QgcG9zdGl2aXR5IHNjb3JlLiBBbm90aGVyIGludGVyZXN0aW5nIGZhY3QgaXMgdGhhdCBmb3IgZmVtYWxlLCBtYXJyaWVkIHdvbWVuIGhhdmUgc2ltaWxhciBvciBzbGlnaHQgaGlnaGVyIHBvc2l0aXZpdHkgc2NvcmUgd2l0aCB1bm1hcnJpZWQgd29tZW4uIEhvd2V2ZXIsIHRoZSBzY2VuZXJpbyBpcyBvcHBvc2l0ZSBmb3IgbWFsZS4gUGVyaGFwcyBpdCBpcyBiZWNhdXNlIHdvbWVuIGVuam95IG1hcnJpYWdlIG1vcmUgdGhhbiBtZW4uCgpIYXZpbmcgYSBjaGlsZCBhbHNvIGluZnVlbmNlcyB0aGUgcG9zaXRpdml0eSBzY29yZSBvZiBtYWxlIGFuZCBmZW1hbGUgaW4gZGlmZmVyZW50IHdheXMuIEEgbWFycmllZCB3b21lbiB3aG8gaGFzIGtpZHMgaGFzIGEgbG93ZXIgc2NvcmUgdGhhbiBhIG1hcnJpZWQgd29tZW4gd2hvIGRvZXMndCBoYXZlIGtpZHMuIE1lbiB3aG8gaGF2ZSBraWRzIGhhdmUgYSBwb3NpdGl2aXR5IHNjb3JlIGhpZ2hlciB0aGFuIHRob3NlIHdobyBkb24ndCBoYXZlIGtpZHMuCgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0Kd29yZHNfYnlfZGVtbyA8LSBiYWdPZldvcmRzICU+JQogIGNvdW50KGdlbmRlcixtYXJpdGFsLHBhcmVudGhvb2QsIHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICB1bmdyb3VwKCkKCnNlbnRpbWVudHNfYnlfZGVtbyA8LSB3b3Jkc19ieV9kZW1vICU+JQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoImFmaW5uIiksIGJ5ID0gIndvcmQiKSAlPiUKICBncm91cF9ieShnZW5kZXIsbWFyaXRhbCxwYXJlbnRob29kKSAlPiUgc3VtbWFyaXNlKHNjb3JlID0gc3VtKHNjb3JlICogbikgLyBzdW0obikpCgpnZ3Bsb3Qoc2VudGltZW50c19ieV9kZW1vLCBhZXMoeD1tYXJpdGFsLHk9c2NvcmUsZmlsbD1wYXJlbnRob29kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X3dyYXAofmdlbmRlcikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh0aXRsZT0iU2VudGltZW50IFNjb3JlIGJ5IEdlbmRlciIpCgpgYGAKCgoqIEJ5IGNhdGVnb3J5CgpJIGFsc28gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHNlbnRpbWVudCBzY29yZSBvZiBkaWZmZXJlbnQgY2F0ZWdvcmllcy4gVGhvdWdoIG5vdCBzbyBtdWNoIGVudHJpZXMgb2YgaGFwcHkgbW9tZW50cyBhcmUgYWJvdXQgbmF0dXJlLCBuYXR1cmUgaGFzIHRoZSBoaWdoZXN0IHBvc2l0aXZpdHkgc2NvcmUgYW1vbmcgYWxsIGNhdGVnb3JpZXMuIEJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgKipuaWNlKiogd29yZHMgd2hlbiBkZXNjcmliaW5nIHRoZSBuYXR1cmUsIHN1Y2ggYXMgYmVhdXRpZnVsLCB3YXJtIGFuZCBzbyBvbi4gV2Ugd2lsbCBzZWUgdGhhdCBpbiBhIG1vbWVudC4KCgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0Kd29yZHNfYnlfY2F0ZWdvcnkgPC0gYmFnT2ZXb3JkcyAlPiUKICBjb3VudChwcmVkaWN0ZWRfY2F0ZWdvcnksIHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICB1bmdyb3VwKCkKCnNlbnRpbWVudHNfYnlfY2F0ZWdvcnkgPC0gd29yZHNfYnlfY2F0ZWdvcnkgJT4lCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYWZpbm4iKSwgYnkgPSAid29yZCIpICU+JQogIGdyb3VwX2J5KHByZWRpY3RlZF9jYXRlZ29yeSkgJT4lCiAgc3VtbWFyaXplKHNjb3JlID0gc3VtKHNjb3JlICogbikgLyBzdW0obikpCgpzZW50aW1lbnRzX2J5X2NhdGVnb3J5ICU+JQogIG11dGF0ZShjYXRlZ29yeSA9IHJlb3JkZXIocHJlZGljdGVkX2NhdGVnb3J5LCBzY29yZSkpICU+JQogIGdncGxvdChhZXMoY2F0ZWdvcnksIHNjb3JlKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UsZmlsbD0ibGlnaHRibHVlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHk9IkF2ZXJhZ2Ugc2VudGltZW50IHNjb3JlIiwKICAgICAgIHRpdGxlPSJBdmVyYWdlIFNlbnRpbWVudCBTY29yZSBieSBDYXRlZ29yeSIpCmBgYAoKKiBXaGF0IHdvcmRzIGhhdmUgdGhlIG1vc3QgZWZmZWN0IG9uIHNlbnRpbWVudCBzY29yZXMgb3ZlcmFsbD8KCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQpzZW50aW1lbnRzX2J5X3dvcmQgPC0gYmFnT2ZXb3JkcyAlPiUKICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJhZmlubiIpLCBieSA9ICJ3b3JkIikgJT4lCiAgZ3JvdXBfYnkod29yZCkgJT4lCiAgc3VtbWFyaXplKG9jY3VyZW5jZXMgPSBuKCksCiAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiA9IHN1bShzY29yZSkpCgpzZW50aW1lbnRzX2J5X3dvcmQgJT4lCiAgdG9wX24oMjAsIGFicyhjb250cmlidXRpb24pKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgY29udHJpYnV0aW9uKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBjb250cmlidXRpb24sIGZpbGwgPSBjb250cmlidXRpb24gPiAwKSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKCkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2UgPSAiYm9sZCIpKSsKICBsYWJzKHRpdGxlPSJXb3JkcyB3aXRoIG1vc3QgZWZmZWN0IG9uIHNlbnRpbWVudCBzY29yZSIpCmBgYAoKKiBXaGF0IHdvcmQgaGF2ZSB0aGUgbW9zdCBlZmZlY3Qgb24gc2VudGltZW50IHNjb3JlcyB3aXRoaW4gZWFjaCBjYXRlZ29yeQoKYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsZmlnLmhlaWdodD0xMH0KdG9wX3NlbnRpbWVudF93b3JkcyA8LSB3b3Jkc19ieV9jYXRlZ29yeSAlPiUKICBpbm5lcl9qb2luKGdldF9zZW50aW1lbnRzKCJhZmlubiIpLCBieSA9ICJ3b3JkIikgJT4lCiAgbXV0YXRlKGNvbnRyaWJ1dGlvbiA9IHNjb3JlICogbiAvIHN1bShuKSkKICAKdG9wX3NlbnRpbWVudF93b3JkcyAlPiUKICBncm91cF9ieShwcmVkaWN0ZWRfY2F0ZWdvcnkpICU+JQogIHRvcF9uKDUsIGFicyhjb250cmlidXRpb24pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHdvcmQ9cmVvcmRlcihwYXN0ZSh3b3JkLHByZWRpY3RlZF9jYXRlZ29yeSxzZXAgPSAiX18iKSwgY29udHJpYnV0aW9uKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBjb250cmlidXRpb24sIGZpbGwgPSBjb250cmlidXRpb24gPiAwKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIGdzdWIoIl9fLiskIiwgIiIsIHgpKSArCiAgZmFjZXRfd3JhcCh+IHByZWRpY3RlZF9jYXRlZ29yeSwgc2NhbGVzID0gImZyZWUiLCBucm93ID0gNCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHRpdGxlID0gIlRvcCBmaXZlIHdvcmRzIHdpdGggaGlnaGVzdCBjb250cmlidXRpb24gaW4gZWFjaCBjYXRlZ29yeSIpCiAgCmBgYAoKKioqCgojIyBCaWdyYW0gQW5hbHlzaXMKCiogV2hhdCBpcyB5b3VyIGZhdm9yaXRlIHRoaW5nPwoKYGBge3IsZWNobz1GQUxTRX0KI2JpZ3JhbSBhbmFseXNpcwpiaWdyYW1zIDwtIG9uZS5saW5lICU+JSBmaWx0ZXIoY291bnQhPTEpICU+JQogIHVubmVzdF90b2tlbnMoYmlncmFtLCB0ZXh0LCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMikKI2NvdW50IGJpZ3JhbSBmcmVxdWVuY3kKYmlncmFtX2NvdW50cyA8LSBiaWdyYW1zICU+JQogIGNvdW50KHByZWRpY3RlZF9jYXRlZ29yeSwgYmlncmFtLCBzb3J0ID0gVFJVRSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlcGFyYXRlKGJpZ3JhbSwgYygid29yZDEiLCAid29yZDIiKSwgc2VwID0gIiAiKQoKIyBmYXZvcml0ZSB3b3JkcwpmaXJzdF93b3JkIDwtIGMoImZhdm9yaXRlIiwiZmF2b3VyaXRlIikKIyB0b3AgMTAgd29yZHMgZm9sbG93ZWQgZmF2b3JpdGUKYmlncmFtX2NvdW50cyAlPiUKICBmaWx0ZXIod29yZDEgJWluJSBmaXJzdF93b3JkKSAlPiUKICBjb3VudCh3b3JkMSwgd29yZDIsIHd0ID0gbiwgc29ydCA9IFRSVUUpICU+JQogIGdyb3VwX2J5KHdvcmQxKSAlPiUKICB0b3BfbigxMCwgbm4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUod29yZDIgPSByZW9yZGVyKHBhc3RlKHdvcmQyLCB3b3JkMSwgc2VwID0gIl9fIiksIG5uKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkMiwgbm4pKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSxmaWxsPSJvcmFuZ2UiKSArCiAgZmFjZXRfd3JhcCh+IHdvcmQxLCBzY2FsZXMgPSAiZnJlZSIsIG5yb3cgPSAxKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBnc3ViKCJfXy4rJCIsICIiLCB4KSkgKwogIGxhYnMoeD0iV29yZHMgcHJlY2VkZWQgYnkgZmF2b3JpdGUiLAogICAgICAgeT0iTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwKICAgICAgIHRpdGxlPSJNeSBmYXZvcml0ZSBpcyAuLi4iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZSA9ICJib2xkIikpICsKICBjb29yZF9mbGlwKCkKYGBgCgpIZXJlIEkgY291bnQgdG9wIHRlbiB3b3JkcyBwcmVjZWRlZCBieSB3b3JkICpmYXZvcml0ZS9mYXZvdXJpdGUqLiBJbnRlcmVzdGluZ2x5LCBTRVZFTiBvZiB0aGVtLCBpbmNsdWRpbmcgdGhlIHRvcCBvbmVzLCBhcmUgYWJvdXQgZWF0aW5nLiBUaG9zZSB3b3JkcyBhcmUgKnJlc3RhdXJhbnQqLCAqZm9vZCosICptZWFsKiwgKmRpc2gqLCAqc25hY2sqLCAqc3dlZXQqLCAqZGlubmVyKi4gQXBwYXJlbnRseSwgRWF0aW5nIGlzIHNvIGhhcHB5ISAKCiMjIERpbm5lciwgbXkgZmF2b3JpdGUgZWF0aW5nIHRpbWUhCgpPZiBhbGwgdGhyZWUgbWVhbHMsIHdlIGxvdmUgZGlubmVycywgZXhwZWNpYWxseSB3aXRoIG91ciBiZWxvdmVkIGZyaWVuZHMgYW5kIGZhbWlseS4gSWYgeW91IGFyZSBzdHJ1Z2dsaW5nIG9yIGZydXN0cmF0ZWQgYWJvdXQgc29tZXRoaW5nLCBoYXZpbmcgYSBkZWNlbnQgZGlubmVyIG1heSBiZSB0aGUgcXVpa2VzdCB3YXkgdG8gZ2V0IHlvdSBoYXBweS4KCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9Mn0KZm9vZC5kaWN0IDwtIHJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcml0LXB1YmxpYy9IYXBweURCL21hc3Rlci9oYXBweWRiL2RhdGEvdG9waWNfZGljdC9mb29kLWRpY3QuY3N2JywgY29sX25hbWVzID0gRkFMU0UpCmZvb2QgPC0gYXMudmVjdG9yKGZvb2QuZGljdCRYMSkKZm9vZC5kZiA8LSBiYWdPZldvcmRzICU+JSAKICBmaWx0ZXIod29yZCAlaW4lIGZvb2QpICU+JSBzZWxlY3QoaWQpICU+JSB1bmlxdWUoKSAlPiUKICBsZWZ0X2pvaW4ob25lLmxpbmUsIGJ5PWMoImlkIj0iaWQiKSkKYmFnT2ZXb3Jkc19mb29kIDwtIGZvb2QuZGYgJT4lIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkKd29yZF9jb3VudF9mb29kIDwtIGJhZ09mV29yZHNfZm9vZCAlPiUgY291bnQod29yZCwgc29ydCA9IFRSVUUpCndvcmRjbG91ZDIod29yZF9jb3VudF9mb29kLGVsbGlwdGljaXR5ID0gMC4xLHNpemU9MC42KQpgYGAKCgoKIyMgWXVtbXkhIEkgYW0gc28gaGFwcHkgd2hlbiBJIGFtIGVhdGluZy9kcmlua2luZyAuLi4KCkhlcmUncyBtb3N0IGZyZXF1ZW50IHdvcmRzIGFib3V0IGZvb2QgYW5kIGRyaW5rcyBpbiB0aGUgc2V0LiAqKkNvZmZlZSoqIGFuZCAqKlBpenphKiogYXJlIHRoZSBiZXN0IGZvb2QvZHJpbmsgdG8gY2hlZXIgb25lIHVwLiBTd2VldCBkZXNzZXJ0IGxpa2UgaWNlIGNyZWFtLCBjaG9jb2xhdGUsIGNha2UgYW5kIGNhbmR5IGNhbiBhbHNvIGdpdmUgYSBzZW5zZSBvZiBzd2VldG5lc3MgdG8gb3VyIGxpdmVzLiAKCk5leHQgdGltZSwgaWYgeW91IGFyZSB1bmhhcHB5LCBtYXliZSB5b3UgYXJlIGp1c3QgaHVuZ3J5LiBPcmRlciBhIHBpenphIGFuZCBpbnZpdGUgeW91ciBmcmllbmQgdG8gc2hhcmUgaXQgd2l0aCB5b3UsIGV2ZXJ5dGhpbmcgd2lsbCBiZSBva2F5IDopIAoKSSBhbHNvIG5vdGVkIHRoYXQgYW1vbmcgdGhlc2UgZm9vZCwgdGhlIG9ubHkgb25lIHRoYXQgaXMgbW9yZSBhdXRoZW50aWMgaXMgU3VzaGkuIE1heWJlIHRoYXQncyByZWFzb24gd2h5IHN1c2hpIGlzIHNvIHBvbHVsYXIgd29ybGR3aWRlLgoKCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQojIGpvaW4gaGFwcHkgbW9tZW50cyBvbiBmb29kIHRvcGljIHdpdGggdGhlIHNlbnNlIGRhdGEKc2Vuc2UuZm9vZCA8LSBmb29kLmRmICU+JSBzZWxlY3QoImhtaWQiKSAlPiUgbGVmdF9qb2luKHNlbnNlLGJ5PSJobWlkIikKZm9vZF93b3JkX2NvdW50IDwtIHNlbnNlICU+JQogIGZpbHRlcihzdXBlcnNlbnNlTGFiZWw9PSJuLmZvb2QiJgogICAgICAgICAgICghbG93ZXJjYXNlTGVtbWElaW4lYygiZm9vZCIsImRpbm5lciIsImx1bmNoIiwiYnJlYWtmYXN0IiwiZHJpbmsiKSkpJT4lCiAgY291bnQobG93ZXJjYXNlTGVtbWEsIHNvcnQgPSBUUlVFKQojIFRvcCAyMCB3b3JkcyBhYm91dCBmb29kCmdncGxvdChmb29kX3dvcmRfY291bnRbMToyMCxdLCAKICAgICAgIGFlcyh4PXJlb3JkZXIobG93ZXJjYXNlTGVtbWEsbikseT1uKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsZmlsbD0iT3JhbmdlIikrCiAgdGhlbWVfbWluaW1hbCgpICsgY29vcmRfZmxpcCgpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHRpdGxlPSJXaGF0IGZvb2Qgb3IgZHJpbmtzIG1ha2VzIHlvdSBoYXBweT8iLAogICAgICAgeD0iZm9vZC9kcmlua3MiLHk9ImZyZXF1ZW5jeSIpCmBgYAoKIyMgRnV0dXJlIEFuYWx5c2lzCgpTb21lIGZ1dHVyZSBhbmF5c2lzIEkgY2FuIHRoaW5rIG9mIHJpZ2h0IG5vdyBpcyAKCisgdG9waWMgbW9kZWxpbmcsIGNhdGVnb3JpemVkIGhhcHB5IG1vbWVudHMgaW50byB0b3BpY3MgbGlrZSBleGVyY2lzZSwgc2hvcHBpbmcsIGpvYiwgZWF0aW5nLCBwZXRzLCB2aWRlbyBnYW1lcy4uLgoKKyBEaWZmZXJlbmNlcyBiZXR3ZWVuIGhhcHB5IG1lbW9yaWVzIHJlZmxlY3RlZCBmcm9tIHNob3J0IHRlcm0gYW5kIGxvbmcgdGVybS4KCisgQmFzZWQgb24gZGlmZmVyZW50IHNlZ21lbnRhdGlvIG9mIHBlb3BsZSwgYW5hbHl6ZSB3aGF0IGFjdGl2aXRpZXMgdGhleSBsaWtlIHRvIGRvLgoK